package ar.edu.utn.frba.dds.tp.tests.transacciones;

import java.math.BigDecimal;
import java.util.List;

import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.code.Asientos.ClaseAsiento;
import ar.edu.utn.frba.dds.tp.code.Asientos.EstadoAsiento;
import ar.edu.utn.frba.dds.tp.code.Asientos.UbicacionAsiento;
import ar.edu.utn.frba.dds.tp.code.adapter.AbstractConversor;
import ar.edu.utn.frba.dds.tp.code.transacciones.TipoTransaccion;
import ar.edu.utn.frba.dds.tp.code.transacciones.Transaccion;
import ar.edu.utn.frba.dds.tp.code.usuarios.Usuario;
import ar.edu.utn.frba.dds.tp.code.usuarios.UsuarioStandard;
import ar.edu.utn.frba.dds.tp.code.vuelos.Aerolinea;
import ar.edu.utn.frba.dds.tp.code.vuelos.Busqueda;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;
import ar.edu.utn.frba.dds.tp.homes.TransaccionesHome;

import static junit.framework.Assert.*;

public class transaccionesTests {

	private AsientoDeVuelo asiento;
	private Vuelo vuelo;
	private UsuarioStandard usuario;
	private TransaccionesHome trHome;

	@Before
	public void crearAmbiente(){
		
		asiento = new AsientoDeVuelo(10, new BigDecimal("6000"), ClaseAsiento.PRIMERA, UbicacionAsiento.PASILLO, EstadoAsiento.DISPONIBLE);
		vuelo = new Vuelo("Fly Airways","BA","LA",new LocalDate(2012,10,10).toDate(), new LocalDate(2012,10,11).toDate(), new LocalTime(10,0), new LocalTime(2,10)); 
		
		asiento.setVueloYCodigo(vuelo);
		
		usuario = new UsuarioStandard();
		
		trHome = TransaccionesHome.getInstance();
		trHome.getTransacciones().clear();
	
	}
	
	
	
	@Test
	public void registrarCompraGeneraUnaEntradaEnTransaccionesHome(){
		assertTrue(trHome.getTransacciones().isEmpty());
		new AerolineaMock().comprarAsiento(asiento, usuario);
		assertEquals(trHome.getTransacciones().size(),1);
	}
	
	@Test 
	public void registrarReservaGeneraUnaEntradaEnTransaccionesHome(){
		assertTrue(trHome.getTransacciones().isEmpty());
		new AerolineaMock().reservarAsiento(asiento, usuario);
		assertEquals(trHome.getTransacciones().size(),1);
	}
	
	@Test
	public void conUnaReservaYUnaCompraTransaccionesHomeDevuelveUnaColeccionDeUnElementoSiLePidoLasCompras(){
		AerolineaMock aerolinea = new AerolineaMock();
		aerolinea.reservarAsiento(asiento, usuario);
		aerolinea.comprarAsiento(asiento, usuario);
		
		assertEquals(trHome.getTransacciones().size(),2);
		assertEquals(trHome.getCompras().size(),1);
	}
	
	@Test
	public void reservasDeUnUsuario() {
		AerolineaMock aerolinea = new AerolineaMock();
		aerolinea.reservarAsiento(asiento, usuario);
		aerolinea.comprarAsiento(asiento, usuario);
		
		assertEquals(trHome.getReservas(usuario).size(),1);
	}
	
	
	@After
	public void tirarAbajoElAmbiente(){
		trHome.getTransacciones().clear();
		trHome = null;
	}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++ aerolinea mock +++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


class AerolineaMock extends Aerolinea {

	public AerolineaMock(){
		super();
	}
	@Override
	public void comprarAsiento(AsientoDeVuelo asiento, Usuario comprador) {
		super.registrarTransaccion(new Transaccion(asiento, comprador,TipoTransaccion.COMPRA));
	}

	@Override
	public List<Vuelo> vuelosDisponibles(Busqueda busqueda) {
		return null;
	}

	@Override
	public String getName() {
		return null;
	}
	
	public void reservarAsiento(AsientoDeVuelo asiento, UsuarioStandard reservante){
		super.registrarTransaccion(new Transaccion(asiento, reservante,TipoTransaccion.RESERVA));
	}
	@Override
	public AbstractConversor getConversor() {
		return null;
	}
	
	
}